package gui;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.ArrayList;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

import mundo.AnalizadorLexico;
import mundo.SimboloLexico;

public class VentanaPrincipal extends javax.swing.JFrame {
	private VentanaImagen ventanaImagen;
	private JPanel panelAnalizador;
	private JTextArea textAreaTexto;
	private JTable tableTokensValidos;
	private JTable tableErrores;
	private String rutaArchivo;
	private JMenuItem jMenuItemAcercaDe;
	private JMenu jMenu1;
	private AnalizadorLexico analizador;

	/**
	 * Auto-generated main method to display this JFrame
	 */
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				VentanaPrincipal inst = new VentanaPrincipal();
				inst.setLocationRelativeTo(null);
				inst.setVisible(true);
			}
		});
	}

	public VentanaPrincipal() {
		super();
		this.ventanaImagen = new VentanaImagen();
		this.rutaArchivo = null;
		this.analizador = new AnalizadorLexico();
		initGUI();
	}

	private void initGUI() {
		try {
			getContentPane().setLayout(null);

			JMenuBar menuBar = new JMenuBar();
			menuBar.setBounds(0, 0, 277, 21);
			getContentPane().add(menuBar);

			JMenu mnAnalizar = new JMenu("Analizar");
			menuBar.add(mnAnalizar);

			JMenuItem mntmTextoEscrito = new JMenuItem("Texto escrito");
			mntmTextoEscrito.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					textAreaTexto.setText("");
					analizador.analizar(textAreaTexto.getText());
					tableErrores.setModel(new DefaultTableModel(
							convertirAmatriz(analizador.getTablaErrores()),
							new String[] { "Lexema", "Token", "Columna", "Fila" }) {
						boolean[] columnEditables = new boolean[] { false,
								false, false, false };

						public boolean isCellEditable(int row, int column) {
							return columnEditables[column];
						}
					});
					tableErrores.getColumnModel().getColumn(0)
							.setPreferredWidth(125);
					tableErrores.getColumnModel().getColumn(1)
							.setPreferredWidth(183);
					tableErrores.getColumnModel().getColumn(2)
							.setPreferredWidth(55);
					tableErrores.getColumnModel().getColumn(3)
							.setPreferredWidth(31);
					tableErrores.repaint();
					tableTokensValidos.setModel(new DefaultTableModel(
							convertirAmatriz(analizador.getTablaSimbolos()),
							new String[] { "Lexema", "Token", "Columna", "Fila" }) {
						boolean[] columnEditables = new boolean[] { false,
								false, false, false };

						public boolean isCellEditable(int row, int column) {
							return columnEditables[column];
						}
					});
					tableTokensValidos.getColumnModel().getColumn(0)
							.setPreferredWidth(125);
					tableTokensValidos.getColumnModel().getColumn(1)
							.setPreferredWidth(183);
					tableTokensValidos.getColumnModel().getColumn(2)
							.setPreferredWidth(55);
					tableTokensValidos.getColumnModel().getColumn(3)
							.setPreferredWidth(31);
					tableTokensValidos.repaint();
				}
			});
			mnAnalizar.add(mntmTextoEscrito);

			JMenuItem mntmArchivo = new JMenuItem("Cargar archivo");
			mntmArchivo.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					JFileChooser miChooser = new JFileChooser();
					miChooser.showOpenDialog(getParent());
					if (miChooser.getSelectedFile() != null)
						rutaArchivo = miChooser.getSelectedFile()
								.getAbsolutePath();
					try {
						String texto = analizador.cargarTexto(rutaArchivo);
						textAreaTexto.setText(texto);
					} catch (IOException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				}
			});
			mnAnalizar.add(mntmArchivo);

			JMenu mnImagenesAfd = new JMenu("Imagenes AFD");
			menuBar.add(mnImagenesAfd);
			{
				jMenu1 = new JMenu();
				menuBar.add(jMenu1);
				jMenu1.setText("Acerca de.");
				{
					jMenuItemAcercaDe = new JMenuItem();
					jMenu1.add(jMenuItemAcercaDe);
					jMenuItemAcercaDe.setText("Acerca De");
					jMenuItemAcercaDe.addActionListener(new ActionListener() {
						public void actionPerformed(ActionEvent arg0) {
							ImageIcon icon = new ImageIcon(
									VentanaPrincipal.class
											.getResource("/Image/AcercaDe.jpg"));
							ventanaImagen.setIcon(icon);
						}
					});
				}
			}

			JMenu mnNumeros = new JMenu("Numeros");
			mnImagenesAfd.add(mnNumeros);

			JMenuItem mntmEnteros = new JMenuItem("Enteros");
			mntmEnteros.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					ImageIcon icon = new ImageIcon(VentanaPrincipal.class
							.getResource("/Image/NumeroEntero.JPG"));
					ventanaImagen.setIcon(icon);
				}
			});
			mnNumeros.add(mntmEnteros);

			JMenuItem mntmReales = new JMenuItem("Reales");
			mntmReales.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					ImageIcon icon = new ImageIcon(VentanaPrincipal.class
							.getResource("/Image/NumeroReal.JPG"));
					ventanaImagen.setIcon(icon);
				}
			});
			mnNumeros.add(mntmReales);

			JMenu mnIdentificadores = new JMenu("Identificadores");
			mnImagenesAfd.add(mnIdentificadores);

			JMenuItem mntmClase = new JMenuItem("Clase");
			mntmClase.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					ImageIcon icon = new ImageIcon(VentanaPrincipal.class
							.getResource("/Image/Clase.JPG"));
					ventanaImagen.setIcon(icon);
				}
			});
			mnIdentificadores.add(mntmClase);

			JMenuItem mntmMetodo = new JMenuItem("Metodo");
			mntmMetodo.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					ImageIcon icon = new ImageIcon(VentanaPrincipal.class
							.getResource("/Image/Metodo.JPG"));
					ventanaImagen.setIcon(icon);
				}
			});
			mnIdentificadores.add(mntmMetodo);

			JMenuItem mntmVariable = new JMenuItem("Variable");
			mntmVariable.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					ImageIcon icon = new ImageIcon(VentanaPrincipal.class
							.getResource("/Image/Variable.JPG"));
					ventanaImagen.setIcon(icon);
				}
			});
			mnIdentificadores.add(mntmVariable);

			JMenu mnPalabrasReservadas = new JMenu("Palabras reservadas");
			mnIdentificadores.add(mnPalabrasReservadas);

			JMenuItem mntmClass = new JMenuItem("Class");
			mntmClass.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					ImageIcon icon = new ImageIcon(VentanaPrincipal.class
							.getResource("/Image/PRClass.JPG"));
					ventanaImagen.setIcon(icon);
				}
			});
			mnPalabrasReservadas.add(mntmClass);

			JMenuItem mntmDouble = new JMenuItem("Double");
			mntmDouble.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					ImageIcon icon = new ImageIcon(VentanaPrincipal.class
							.getResource("/Image/PRDouble.JPG"));
					ventanaImagen.setIcon(icon);
				}
			});
			mnPalabrasReservadas.add(mntmDouble);

			JMenuItem mntmInt = new JMenuItem("Int");
			mntmInt.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					ImageIcon icon = new ImageIcon(VentanaPrincipal.class
							.getResource("/Image/PRInt.JPG"));
					ventanaImagen.setIcon(icon);
				}
			});
			mnPalabrasReservadas.add(mntmInt);

			JMenuItem mntmString = new JMenuItem("String");
			mntmString.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					ImageIcon icon = new ImageIcon(VentanaPrincipal.class
							.getResource("/Image/PRString.JPG"));
					ventanaImagen.setIcon(icon);
				}
			});
			mnPalabrasReservadas.add(mntmString);

			JMenuItem mntmIf = new JMenuItem("If");
			mntmIf.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					ImageIcon icon = new ImageIcon(VentanaPrincipal.class
							.getResource("/Image/PRIf.JPG"));
					ventanaImagen.setIcon(icon);
				}
			});
			mnPalabrasReservadas.add(mntmIf);

			JMenuItem mntmWhile = new JMenuItem("While");
			mntmWhile.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					ImageIcon icon = new ImageIcon(VentanaPrincipal.class
							.getResource("/Image/PRWhile.JPG"));
					ventanaImagen.setIcon(icon);
				}
			});
			mnPalabrasReservadas.add(mntmWhile);

			JMenuItem mntmFor = new JMenuItem("For");
			mntmFor.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					ImageIcon icon = new ImageIcon(VentanaPrincipal.class
							.getResource("/Image/PRFor.JPG"));
					ventanaImagen.setIcon(icon);
				}
			});
			mnPalabrasReservadas.add(mntmFor);
			
			JMenuItem mntmImport = new JMenuItem("Import");
			mntmImport.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					ImageIcon icon = new ImageIcon(VentanaPrincipal.class
							.getResource("/Image/PRImport.JPG"));
					ventanaImagen.setIcon(icon);
				}
			});
			mnPalabrasReservadas.add(mntmImport);
			
			JMenuItem mntmPackage = new JMenuItem("Package");
			mntmPackage.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					ImageIcon icon = new ImageIcon(VentanaPrincipal.class
							.getResource("/Image/PRPackage.JPG"));
					ventanaImagen.setIcon(icon);
				}
			});
			mnPalabrasReservadas.add(mntmPackage);

			JMenu mnOperadoresAritmeticos = new JMenu("Operadores aritmeticos");
			mnImagenesAfd.add(mnOperadoresAritmeticos);

			JMenuItem mntmAditivos = new JMenuItem("Aditivos");
			mntmAditivos.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					ImageIcon icon = new ImageIcon(VentanaPrincipal.class
							.getResource("/Image/Suma.JPG"));
					ventanaImagen.setIcon(icon);
				}
			});
			mnOperadoresAritmeticos.add(mntmAditivos);

			JMenuItem mntmMultiplicativos = new JMenuItem("Multiplicativos");
			mntmMultiplicativos.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					ImageIcon icon = new ImageIcon(VentanaPrincipal.class
							.getResource("/Image/Multiplicacion.JPG"));
					ventanaImagen.setIcon(icon);
				}
			});
			mnOperadoresAritmeticos.add(mntmMultiplicativos);

			JMenu mnOperadoresRelacionales = new JMenu(
					"Operadores relacionales");
			mnImagenesAfd.add(mnOperadoresRelacionales);

			JMenuItem mntmMayorQue = new JMenuItem("Mayor que");
			mntmMayorQue.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					ImageIcon icon = new ImageIcon(VentanaPrincipal.class
							.getResource("/Image/MayorQue.JPG"));
					ventanaImagen.setIcon(icon);
				}
			});
			mnOperadoresRelacionales.add(mntmMayorQue);

			JMenuItem mntmMenorQue = new JMenuItem("Menor que");
			mntmMenorQue.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					ImageIcon icon = new ImageIcon(VentanaPrincipal.class
							.getResource("/Image/MenorQue.JPG"));
					ventanaImagen.setIcon(icon);
				}
			});
			mnOperadoresRelacionales.add(mntmMenorQue);

			JMenuItem mntmMayorOIgual = new JMenuItem("Mayor o igual que");
			mntmMayorOIgual.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					ImageIcon icon = new ImageIcon(VentanaPrincipal.class
							.getResource("/Image/MayorIgualQue.JPG"));
					ventanaImagen.setIcon(icon);
				}
			});
			mnOperadoresRelacionales.add(mntmMayorOIgual);

			JMenuItem mntmMenorOIgual = new JMenuItem("Menor o igual que");
			mntmMenorOIgual.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					ImageIcon icon = new ImageIcon(VentanaPrincipal.class
							.getResource("/Image/MenorIgualQue.JPG"));
					ventanaImagen.setIcon(icon);
				}
			});
			mnOperadoresRelacionales.add(mntmMenorOIgual);

			JMenu mnParentesis = new JMenu("Parentesis");
			mnImagenesAfd.add(mnParentesis);

			JMenuItem mntmApertura = new JMenuItem("Apertura");
			mntmApertura.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					ImageIcon icon = new ImageIcon(VentanaPrincipal.class
							.getResource("/Image/ParentesisApertura.JPG"));
					ventanaImagen.setIcon(icon);
				}
			});
			mnParentesis.add(mntmApertura);

			JMenuItem mntmCierre = new JMenuItem("Cierre");
			mntmCierre.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					ImageIcon icon = new ImageIcon(VentanaPrincipal.class
							.getResource("/Image/ParentesisCierre.JPG"));
					ventanaImagen.setIcon(icon);
				}
			});
			mnParentesis.add(mntmCierre);

			JMenuItem mntmOperadorDeAsignacion = new JMenuItem(
					"Operador de asignacion");
			mntmOperadorDeAsignacion.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					ImageIcon icon = new ImageIcon(VentanaPrincipal.class
							.getResource("/Image/Asignacion.JPG"));
					ventanaImagen.setIcon(icon);
				}
			});
			mnImagenesAfd.add(mntmOperadorDeAsignacion);

			JMenuItem mntmOperadoresLogicos = new JMenuItem(
					"Operadores logicos");
			mntmOperadoresLogicos.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					ImageIcon icon = new ImageIcon(VentanaPrincipal.class
							.getResource("/Image/OperadoresLogicos.JPG"));
					ventanaImagen.setIcon(icon);
				}
			});
			mnImagenesAfd.add(mntmOperadoresLogicos);

			JMenuItem mntmSeparador = new JMenuItem("Separador");
			mntmSeparador.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					ImageIcon icon = new ImageIcon(VentanaPrincipal.class
							.getResource("/Image/Separador.JPG"));
					ventanaImagen.setIcon(icon);
				}
			});
			mnImagenesAfd.add(mntmSeparador);

			JMenuItem mntmTerminal = new JMenuItem("Terminal");
			mntmTerminal.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					ImageIcon icon = new ImageIcon(VentanaPrincipal.class
							.getResource("/Image/Terminal.JPG"));
					ventanaImagen.setIcon(icon);
				}
			});
			mnImagenesAfd.add(mntmTerminal);

			panelAnalizador = new JPanel();
			panelAnalizador.setBounds(10, 32, 845, 533);
			getContentPane().add(panelAnalizador);
			panelAnalizador.setLayout(null);

			JScrollPane scrollPaneTexto = new JScrollPane();
			scrollPaneTexto.setBounds(10, 11, 383, 477);
			panelAnalizador.add(scrollPaneTexto);

			textAreaTexto = new JTextArea();
			scrollPaneTexto.setViewportView(textAreaTexto);

			JButton btnAnalizar = new JButton("Analizar");
			btnAnalizar.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					analizador.analizar(textAreaTexto.getText());
					tableErrores.setModel(new DefaultTableModel(
							convertirAmatriz(analizador.getTablaErrores()),
							new String[] { "Lexema", "Token", "Columna", "Fila" }) {
						boolean[] columnEditables = new boolean[] { false,
								false, false, false };

						public boolean isCellEditable(int row, int column) {
							return columnEditables[column];
						}
					});
					tableErrores.getColumnModel().getColumn(0)
							.setPreferredWidth(125);
					tableErrores.getColumnModel().getColumn(1)
							.setPreferredWidth(183);
					tableErrores.getColumnModel().getColumn(2)
							.setPreferredWidth(55);
					tableErrores.getColumnModel().getColumn(3)
							.setPreferredWidth(31);
					tableErrores.repaint();
					tableTokensValidos.setModel(new DefaultTableModel(
							convertirAmatriz(analizador.getTablaSimbolos()),
							new String[] { "Lexema", "Token", "Columna", "Fila" }) {
						boolean[] columnEditables = new boolean[] { false,
								false, false, false };

						public boolean isCellEditable(int row, int column) {
							return columnEditables[column];
						}
					});
					tableTokensValidos.getColumnModel().getColumn(0)
							.setPreferredWidth(125);
					tableTokensValidos.getColumnModel().getColumn(1)
							.setPreferredWidth(183);
					tableTokensValidos.getColumnModel().getColumn(2)
							.setPreferredWidth(55);
					tableTokensValidos.getColumnModel().getColumn(3)
							.setPreferredWidth(31);
					tableTokensValidos.repaint();
				}
			});
			btnAnalizar.setBounds(150, 499, 89, 23);
			panelAnalizador.add(btnAnalizar);

			JScrollPane scrollPane = new JScrollPane();
			scrollPane.setBounds(403, 34, 432, 207);
			panelAnalizador.add(scrollPane);

			tableTokensValidos = new JTable();
			tableTokensValidos.setModel(new DefaultTableModel(
					new Object[][] { { null, null, null, null }, },
					new String[] { "Lexema", "Token", "Columna", "Fila" }) {
				boolean[] columnEditables = new boolean[] { false, false,
						false, false };

				public boolean isCellEditable(int row, int column) {
					return columnEditables[column];
				}
			});
			tableTokensValidos.getColumnModel().getColumn(0)
					.setPreferredWidth(125);
			tableTokensValidos.getColumnModel().getColumn(1)
					.setPreferredWidth(183);
			tableTokensValidos.getColumnModel().getColumn(2)
					.setPreferredWidth(55);
			tableTokensValidos.getColumnModel().getColumn(3)
					.setPreferredWidth(31);
			tableTokensValidos.setRowSelectionAllowed(false);
			scrollPane.setViewportView(tableTokensValidos);

			JLabel lblListaDeTokens = new JLabel("Lista De Tokens Validos");
			lblListaDeTokens.setBounds(403, 11, 282, 14);
			panelAnalizador.add(lblListaDeTokens);

			JLabel lblListaDeErrores = new JLabel("Lista De Errores Lexicos");
			lblListaDeErrores.setBounds(403, 252, 311, 14);
			panelAnalizador.add(lblListaDeErrores);

			JScrollPane scrollPane_1 = new JScrollPane();
			scrollPane_1.setBounds(403, 277, 432, 211);
			panelAnalizador.add(scrollPane_1);

			tableErrores = new JTable();
			tableErrores.setModel(new DefaultTableModel(new Object[][] { {
					null, null, null, null }, }, new String[] { "Lexema",
					"Token", "Columna", "Fila" }) {
				boolean[] columnEditables = new boolean[] { false, false,
						false, false };

				public boolean isCellEditable(int row, int column) {
					return columnEditables[column];
				}
			});
			tableErrores.getColumnModel().getColumn(0).setPreferredWidth(125);
			tableErrores.getColumnModel().getColumn(1).setPreferredWidth(183);
			tableErrores.getColumnModel().getColumn(2).setPreferredWidth(55);
			tableErrores.getColumnModel().getColumn(3).setPreferredWidth(31);
			tableErrores.setRowSelectionAllowed(false);
			scrollPane_1.setViewportView(tableErrores);
		} catch (Exception e) {
			// add your error handling code here
			e.printStackTrace();
		}
		this.setSize(873, 607);
	}

	/**
	 * Metodo que permite convertir una lista de simbolos lexicos en una matriz
	 * de 4 columnas.
	 * 
	 * @param lista
	 *            El listado de SimbolosLexicos a convertir.
	 * @return La matriz resultado de la conversion.
	 */
	public Object[][] convertirAmatriz(ArrayList<SimboloLexico> lista) {
		Object[][] matriz = null;
		if (lista == null || lista.size() == 0) {
			matriz = new Object[1][4];
			matriz[0][0] = new String("-");
			matriz[0][1] = new String("-");
			matriz[0][2] = new String("-");
			matriz[0][3] = new String("-");
			return matriz;
		}
		matriz = new Object[lista.size()][4];
		for (int i = 0; i < lista.size(); i++) {
			matriz[i][0] = lista.get(i).getLexema();
			matriz[i][1] = lista.get(i).getToken();
			matriz[i][2] = lista.get(i).getColumna();
			matriz[i][3] = lista.get(i).getFila();
		}
		return matriz;
	}
}
